基本展示

下载数据的时候找的保存为shapefile数据的代码

获取到的数据可以转换为networkx里的multigraph,digraph这些,和networkx交互; 也可以转换为geopandas里的格式

⚡ 可以采用的一个措施:
将节点和边那种的shp导入进来,通过geopandas类似的进行处理,形成geodataframes类似的格式,然后在转换成multidigraph; 也可以往上面两个结构靠,就是保证gdf_nodes是用omsid编码的,gdf_edges是用u,v,key来多重索引的;

You can create a graph from node/edge GeoDataFrames, as long as gdf_nodes is indexed by osmid and gdf_edges is multi-indexed by u, v, key (following normal MultiDiGraph structure). This allows you to load graph node/edge shapefiles or GeoPackage layers as GeoDataFrames then convert to a MultiDiGraph for graph analytics

'n': 1929,节点的数量
'm': 4945, 边的数量
'k_avg': 5.127008812856403, 平均节点度(包括了入度和出度) 'intersection_count': 1706, 交叉点数量
'streets_per_node_avg': 3.0031104199066876,无向图中,每个节点连接的街道数目(边)的平均值
'streets_per_node_counts': {0: 0, 1: 223, 2: 12, 3: 1246, 4: 432, 5: 16},无向图中,连接到一个节点的街道数目:这个数字下的街道数目一共有多少
'streets_per_node_proportion': {0: 0.0, 1: 0.11560393986521514, 2: 0.006220839813374806, 3: 0.6459305339554173, 4: 0.223950233281493, 5: 0.00829445308449974},无向图中,对应的改成了占比
'edge_length_total': 774358.6850000017,米制的所有边长度的总和
'edge_length_avg': 156.59427401415604,上面的均值
'street_length_total': 486759.9220000005,在无向图中,米制的所有边长度的总和
'street_length_avg': 171.636079689704,上面的均值
'street_segments_count': 2836,无向图中,边的数量
'node_density_km': 35.29736508882025,平方千米下的,面积除以n
'intersection_density_km': 31.21685061769173,平方千米下的,面积除以intersection_count
'edge_density_km': 14169.425201733446,km下的,edge_length_total divided by area
'street_density_km': 8906.86504792104,km下的,street_length_total divided by area
'circuity_avg': 2.0995288875627176e-05,每个边的节点之间最大圆环距离,除以,边的总长度
'self_loop_proportion': 0.0008088978766430738,表示proportion of edges that have a single node as its endpoints (ie, the edge links nodes u and v, and u==v)
'clean_intersection_count': 8906.86504792104,表示number of intersections in street network, merging complex ones into single points
'clean_intersection_density_km': 23.29369920065743,km下的,clean_intersection_count divided by area

下面配的图针对的就是实验的2021年的

⚡可视化街道中心性,就是利用relative closeness centrality来进行可视化,这里能计算closeness_centrality,那也能计算其他参数,那么这些参数的计算公式,和空间句法里计算参数的区别,这些东西都可以进一步学习

routing

利用google API或者是遥感影像文件,获取得到路网节点对应的高程数据,再赋予色彩进行可视化
try:

except ImportError:

获取网络的其他方式

查询,简化,可视化,保存

⚡:简化的效果挺好,思考下能不能把2011或者2021的数据套进来

routing, speed imputation and travel times

⚡这一部分可以看看要不要用,可不可以用
Imputes free-flow travel speeds for all edges based on mean maxspeed value of edges, per highway type. This mean-imputation can obviously be imprecise, and the caller can override it by passing in hwy_speeds and/or fallback arguments that correspond to local speed limit standards.

在导航的时候,正确处理了单项的街道;此外,在节点之间如果有平行的边,OSMNX会选择最abs的边来绘制

graph place queries

交叉点处理、简化并构建拓扑

上面的这种cleaned up intersections得到了更准确的交点数量和密度,但不改变或者整合网络中的拓扑,而是需要我们重建图

通过对比发现,有的边没了,不过节点确实得到了简化;而且那种四个点的也没了;
设置rebuild_graph=False知识把节点缓冲区内的点合并;设置为True在合并之前还检查了下拓扑

获取网络相关方法中的clean_periphery参数默认是True,表示执行清除外围;具体操作包括:

  1. 对于请求的区域做一个0.5km的缓冲区,获取包含缓冲区的大区域内的路网;
  2. 简化拓扑,仅存留表示街道交叉口的节点
  3. 计算大的网络下的每个节点的无向的度;
  4. 裁剪网络到请求的区域大小
  5. 保存节点度的数值作为图的属性

相对上面的图,这里清除了stray peripheral edges;在左下角的有两个interstitial nodes被保留了,因为在大的网络中,这两个其实是intersections,而OSMnx也正确的保留了这些节点,在intersection density的求解中也被考虑了进来

保存和加载

street network over place shape

这个市政边界是一个行政边界,而不是一个物理边界,所以它代表的是管辖边界,而不是个别的物理特征,如岛屿。要获得单个岛屿的几何图形,使用“geometries”模块:

自定义过滤条件

如果下载的数据量太大,OSMnx会把请求分割成多个服务器请求来下载所有数据,然后分配到网络图上

绘图

街道宽度:默认是根据highway属性来进行可视化,也可以进行自定义,没有被自定义的就还是使用默认宽度

下载建筑足迹数据,并作为图底进行可视化

节点高程和边等级

osmnx可以使用elevation模块来自行给节点添加高程属性,或者加载本地栅格数据或谷歌高程api作为高程数据源,使用谷歌api的话需要密钥。

有了高程数据后,osmnx可以自动计算边的等级

使用谷歌api的案例省略

一些指标的统计:
使用网络的无向图方式,这样就不会重复计算双向的街道。对于街道等级,使用绝对值,这样就关注于了街道的阶数而不是它的方向

绘制等值线图isochrone map

绘制步行5,10,15,20等时间内行走的距离

绘制凸包表示convex hull

绘制等值线作为缓冲区,得到比凸包更准确的等值区域

OSMnx结合igraph

networkX是纯python写的,所以虽然使用简单,但面对大型网络的处理分析略显吃力,这里可以转向别的工具,像igraph, graph-tool or cugraph for analysis.

高阶绘图

使用plot模块

可以用bbox把绘图限制在图的某些精确的部分。例如,想要查看,是否完成了consolidate nearby intersections to clean-up node clusters

标注街道段名字

下载地理实体

可以使用geometries模块来下载实体,例如grocery stores, transit stops, POI or building footprints,并转变为GeoDataFrame

街道网络的方向

也可以通过ox.bearing.orientation_entropy函数来计算空间图的orientation entropy